package com.kclm.se.annotation.apt;

import java.lang.Character.Subset;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.kclm.se.annotation.Hello;
import com.kclm.se.annotation.MyIgnore;
import com.kclm.se.annotation.MyTest;
import com.kclm.se.annotation.SubUseHello;

public class AptDemo {

	public static void main(String[] args) {
		//加载目标类
		int execute = 0;//执行的方法个数
		int ignore = 0; //忽略的方法个数
		SubUseHello sh = new SubUseHello();
		Class<?> c = sh.getClass();
		//判断此类是否使用了注解
		if(c.isAnnotationPresent(MyTest.class)) {
			//...
			System.out.println("此类使用了 @MyTest 注解");
			//进一步获取这个注解，并调用注解方法来获取信息
			MyTest mt = c.getAnnotation(MyTest.class);
			//
			System.out.println(mt.message());
			//获取此类中的所有方法
			Method[] methods = c.getDeclaredMethods();
			//
			for(Method m : methods) {
				m.setAccessible(true);
				// 判断方法层面是否使用了 @MyIgnore 注解
				if(m.isAnnotationPresent(MyIgnore.class)) {
					//忽略此方法
					ignore++; //计数一次
					continue;
				}
				
				//调用此方法, 由于此method所代表的方法不是静态方法，所有，要使用对象来调用。
				try {
					m.invoke(sh);
					//
					execute++; //计数一次
				} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
					e.printStackTrace();
				}
			}
			
			//输出
			System.out.printf("此类中方法执行结果 => 执行次数：%d, 忽略个数：%d\n", execute,ignore);
		} else {
			System.out.println("此类没有使用 @MyTest 注解");
		}
		
		if(c.isAnnotationPresent(Hello.class)) {
			System.out.println("此类使用了 @Hello 注解");
		} else {
			System.out.println("此类没有使用 @Hello 注解");
		}
	}
}
